package org.manekineko.services.impl;

import java.io.IOException;
import java.util.ResourceBundle;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.ParseException;
import org.manekineko.dao.ResultadoDAO;
import org.manekineko.dao.impl.ResultadoMSDAO;
import org.manekineko.services.BaseService;
import org.manekineko.services.ResultadoService;

/**
 * 
 * @author josen
 * 
 */
public class ResultadoServicesMS extends BaseService implements ResultadoService {

	static ResourceBundle rb = ResourceBundle.getBundle("maneki");

	private ResultadoDAO resultadoDAO;

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.manekineko.services.ResultadoService#buscarNumeroUltimoSorteioCEF()
	 */
	public int buscarNumeroUltimoSorteioCEF() {
		int resultado = 0;

		String url = rb.getString("url.ms");
		try {
			resultado = numeroUltimoSorteio(response(url));
		} catch (IOException e) {
			e.printStackTrace();
		}

		return resultado;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.manekineko.services.ResultadoService#atualizarResultados()
	 */
	public void atualizarResultados() {
		
		// último sorteio
		int n = buscarNumeroUltimoSorteioCEF();

		// último sorteio gravado
		int p = getResultadoDao().buscarNumeroUltimoSorteio();

		for (int numeroSorteio = p + 1; numeroSorteio <= n; numeroSorteio++) {
			Integer[] resultado = buscarResultado(numeroSorteio);
			getResultadoDao().salvarSorteio(numeroSorteio, resultado);
		}
		
		// atualizar hashes
		getResultadoDao().atualizarHashSorteios();
		
		// atrasos
		getResultadoDao().registrarAtrasos();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.manekineko.services.ResultadoService#buscarResultado()
	 */
	public Integer[] buscarResultado() {
		return buscarResultado(0);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.manekineko.services.ResultadoService#buscarResultado(int)
	 */
	public Integer[] buscarResultado(int numeroSorteio) {
		Integer[] result = new Integer[6];

		String url = null;
		if (numeroSorteio > 0) {
			url = String.format("%s%s%s", rb.getString("url.ms"), "?submeteu=sim&opcao=concurso&txtConcurso=",
					numeroSorteio);
		} else {
			url = rb.getString("url.ms");
		}

		try {
			result = obterDezenas(response(url));
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return result;
	}

	/**
	 * 
	 * @param s
	 * @return
	 */
	private Integer[] obterDezenas(String s) {
		Integer[] result = new Integer[6];

		String[] parts = s.split("\\|");
		Pattern p = Pattern.compile("<li>[0-9]{2}</li>");
		Matcher m = p.matcher(parts[2]);

		int i = 0;
		while (m.find()) {
			result[i] = Integer.valueOf(parts[2].substring(m.start() + 4, m.end() - 5));
			i++;
		}

		return result;
	}

	/**
	 * 
	 * @param s
	 * @return
	 */
	private int numeroUltimoSorteio(String s) {
		int result = 0;

		String[] parts = s.split("\\|");
		result = Integer.valueOf(parts[0]);

		return result;
	}

	/**
	 * 
	 * @return
	 */
	private ResultadoDAO getResultadoDao() {
		if (resultadoDAO == null) {
			resultadoDAO = new ResultadoMSDAO();
		}
		return resultadoDAO;
	}

	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		ResultadoServicesMS rms = new ResultadoServicesMS();
		// print(rms.buscarResultado(1630));
		// print(rms.buscarResultado());
		rms.atualizarResultados();
	}

}
